[IA64] vti save-restore: reap ioreq after resume.
authorAlex Williamson <alex.williamson@hp.com>
Wed, 7 Nov 2007 17:10:20 +0000 (10:10 -0700)
committerAlex Williamson <alex.williamson@hp.com>
Wed, 7 Nov 2007 17:10:20 +0000 (10:10 -0700)
Otherwise ioreq is left as STATE_IORESP_READY
so that the domain will be paniced.

Signed-off-by: Isaku Yamahata <yamahata@valinux.co.jp>
xen/arch/ia64/vmx/vmx_init.c
xen/arch/ia64/xen/domain.c
xen/include/asm-ia64/vmx.h

index 00366d397e35bb125b5200d78dad6b674a2b355d..821ec7f623ba051d7a00c55c408c0af7d0e65d6e 100644 (file)
@@ -436,7 +436,32 @@ int vmx_setup_platform(struct domain *d)
        return 0;
 }
 
-void vmx_do_launch(struct vcpu *v)
+void vmx_do_resume(struct vcpu *v)
 {
+       ioreq_t *p;
+
        vmx_load_all_rr(v);
+       migrate_timer(&v->arch.arch_vmx.vtm.vtm_timer, v->processor);
+
+       /* stolen from hvm_do_resume() in arch/x86/hvm/hvm.c */
+       /* NB. Optimised for common case (p->state == STATE_IOREQ_NONE). */
+       p = &get_vio(v->domain, v->vcpu_id)->vp_ioreq;
+       while (p->state != STATE_IOREQ_NONE) {
+               switch (p->state) {
+               case STATE_IORESP_READY: /* IORESP_READY -> NONE */
+                       vmx_io_assist(v);
+                       break;
+               case STATE_IOREQ_READY:
+               case STATE_IOREQ_INPROCESS:
+                       /* IOREQ_{READY,INPROCESS} -> IORESP_READY */
+                       wait_on_xen_event_channel(v->arch.arch_vmx.xen_port,
+                                         (p->state != STATE_IOREQ_READY) &&
+                                         (p->state != STATE_IOREQ_INPROCESS));
+                       break;
+               default:
+                       gdprintk(XENLOG_ERR,
+                                "Weird HVM iorequest state %d.\n", p->state);
+                       domain_crash_synchronous();
+               }
+       }
 }
index 08b642694ed4abb271669410f4ae5282dd5d42c6..97932d5b22cd3120e2ec0fbfa9bf2827424c068d 100644 (file)
@@ -203,11 +203,9 @@ void schedule_tail(struct vcpu *prev)
        context_saved(prev);
        ia64_disable_vhpt_walker();
 
-       if (VMX_DOMAIN(current)) {
-               vmx_do_launch(current);
-               migrate_timer(&current->arch.arch_vmx.vtm.vtm_timer,
-                             current->processor);
-       } else {
+       if (VMX_DOMAIN(current))
+               vmx_do_resume(current);
+       else {
                if (VMX_DOMAIN(prev))
                        ia64_set_iva(&ia64_ivt);
                load_region_regs(current);
index 0f03df630656edb53d1c41e9cfc1f93fed6193a8..c6da04e6fc1bdc4332a63f2de00ea66157a77ed6 100644 (file)
@@ -34,7 +34,7 @@ extern int vmx_final_setup_guest(struct vcpu *v);
 extern void vmx_save_state(struct vcpu *v);
 extern void vmx_load_state(struct vcpu *v);
 extern int vmx_setup_platform(struct domain *d);
-extern void vmx_do_launch(struct vcpu *v);
+extern void vmx_do_resume(struct vcpu *v);
 extern void vmx_io_assist(struct vcpu *v);
 extern int ia64_hypercall (struct pt_regs *regs);
 extern void vmx_save_state(struct vcpu *v);